package com.y.simple.global;

import com.y.simple.bean.LoginUserMsg;
import com.y.simple.utils.StringUtil;
import com.y.simple.utils.ThreadLocalUtil;

public class PowerCheck {

    /**
     * <h1>校验权限</h1>
     * <ui>
     *     <li>传入参数即为所需权限项</li>
     *     <li>通过ThreadLocal中存储的信息进行校验</li>
     *     <li>校验失败将返回全局异常 ResultException</li>
     * </ui>
     * @param powerSimple 权限
     */
    public static void check(String powerSimple) {
        // 从 ThreadLocal 中读取信息
        LoginUserMsg loginUserMsg = ThreadLocalUtil.get();
        // 校验 bean
        if (!beanCheck(loginUserMsg)) {
            throw new ResultException("403","权限异常");
        }
        // 根据权限表对做对照
        if (!powerCompare(loginUserMsg.getPower(), powerSimple)) {
            throw new ResultException("403","权限异常");
        }
    }

    /**
     * <h1>校验bean是否合法</h1>
     * @param msg bean
     * @return 合法返回 true、非法返回 false
     */
    private static boolean beanCheck(LoginUserMsg msg) {
        if (msg == null) {
            return false;
        }
        if (!StringUtil.hasEmpty(msg.getPower())) {
            return false;
        }
        if (!StringUtil.hasEmpty(msg.getType())) {
            return false;
        }
        return msg.getId() != null;
    }

    /**
     * <h1>对比权限组</h1>
     * @param power 权限组，使用；分割
     * @param powerSimple 所需权限
     * @return 权限匹配返回 true，不匹配返回 false
     */
    private static boolean powerCompare(String power, String powerSimple) {
        // 开发者权限直接通过
        if ("*".equals(power)) {
            return true;
        }
        // 对 power 进行切片处理
        String[] powerList = power.split(";");
        // 遍历权限组
        for (String powerTerm : powerList) {
            if (powerSimple.equals(powerTerm)) {
                return true;
            }
        }
        // 均不匹配
        return false;
    }


}
